package Iterator;

/**
 * @Author:CJJ
 * 迭代器模式：
 *  迭代器模式是Java和.Net编程环境中非常常用的设计模式。
 *  迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素，而又不是暴露其内部的表示。
 *  迭代器式属于行为型模式。
 * 意图：
 *  允许顺序访问一个聚合对象中的元素，同时不暴露对象的内部表示。
 * 主要解决的问题
 *  提供一种统一的方法来遍历不同的聚合对象。
 * 使用场景
 *  当需要遍历一个聚合对象，而又不希望暴露其内部结构时。
 * 实现方式
 *  定义迭代器接口：包含hasNext()和next()方法。用于遍历元素
 *  创建具体迭代器：实现迭代器接口,定义如何遍历特定的聚合对象。
 *  聚合类：定义一个接口用于返回一个迭代器对象。
 * 优点：
 *  1.支持多种遍历方式：不同的迭代器可以定义不同的遍历方式。
 *  2.简化聚合类：聚合类不需要关心遍历逻辑
 *  3.多遍历支持：可以同时对同一个聚合对象进行多次遍历。
 *  4.扩展性：增加新的聚合类和迭代器类都很方便,无需修改现有代码。
 * 缺点：
 *  系统复杂性：每增加一个聚合类,就需要增加一个对应的迭代器类,增加了类的数量。
 *
 *  适用场景：
 *   1.当需要访问聚合对象内容而不暴露其内部表示时,使用迭代器模式。
 *   2.当需要为聚合对象提供多种遍历方式时,考虑使用迭代器模式。
 *
 *  注意事项：
 *   迭代器模式通过分离集合对象的遍历行为,使得外边代码可以透明地访问集合内部数据,同时不暴露集合的内部结构
 *   迭代器接口：定义了访问和遍历聚合对象中各个元素的方法,通常包括获取下一个元素，判断是否还有元素，获取
 *   当前位置等方法。
 *   具体迭代器：实现了迭代器接口,定义了如何遍历特定的聚合对象。
 *   聚合类：定义一个接口用于返回一个迭代器对象。
 */
public class IteratorPatternDemo {
    public static void main(String[] args) {
        NameRepository nameRepository = new NameRepository();

        for(Iterator iter = nameRepository.getIterator(); iter.hasNext();){
            String name = (String)iter.next();
            System.out.println("Name : " + name);
        }
    }
}
